n,m=map(int,input().split())
a=sorted(map(int,input().split()))
z=[0]*m
s=0
for i in range(n):
s+=a[i]
z+=[s+z[i]]
print(*z[m:])
num_inp=lambda: int(input())
arr_inp=lambda: list(map(int,input().split()))
sp_inp=lambda: map(int,input().split())
str_inp=lambda:input()
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void dfs(vector<bool>& vis,vector<vector<int>>& ed,ll& curr_ed,ll& curr_v,int node)
{
vis[node]=true;
curr_v++;
curr_ed+=ed[node].size();
for(auto adj:ed[node])
if(!vis[adj])
dfs(vis,ed,curr_ed,curr_v,adj);
}
void solve()
{
int n,m;
cin>>n>>m;
vector<int> arr(n);
for(int i=0;i<n;i++)
cin>>arr[i];
sort(arr.begin(),arr.end());
//store prefix sum
vector<ll> pre(n);
pre[0]=arr[0];
for(int i=1;i<n;i++)
pre[i]=pre[i-1]+arr[i];
vector<ll> ans(n);
ans[0]=0;
for(int i=0;i<n;i++)
{
ll curr=pre[i];
ll oth=0;
if(i>=m)
{
curr-=pre[i-m];
oth+=(ans[i-m]+pre[i-m]);
}
curr+=oth;
ans[i]=curr;
cout<<curr<<" ";
}
}
int main() {
// int t;
// cin>>t;
// while(t--)
// {
// cout<<solve()<<endl;
// // solve();
// }
// cout<<solve()<<endl;
solve();
}
831B - Keyboard Layouts | 814A - An abandoned sentiment from past |
268C - Beautiful Sets of Points | 1391C - Cyclic Permutations |
11A - Increasing Sequence | 1406A - Subset Mex |
1365F - Swaps Again | 50B - Choosing Symbol Pairs |
1719A - Chip Game | 454B - Little Pony and Sort by Shift |
1152A - Neko Finds Grapes | 1719B - Mathematical Circus |
1719C - Fighting Tournament | 1642A - Hard Way |
285C - Building Permutation | 1719E - Fibonacci Strings |
1696C - Fishingprince Plays With Array | 1085A - Right-Left Cipher |
1508B - Almost Sorted | 1690C - Restoring the Duration of Tasks |
1055A - Metro | 1036D - Vasya and Arrays |
1139C - Edgy Trees | 37A - Towers |
353A - Domino | 409H - A + B Strikes Back |
1262A - Math Problem | 158C - Cd and pwd commands |
194A - Exams | 1673B - A Perfectly Balanced String |